/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.syndance.aplicativo.dao;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 *
 * @author gocard
 */
public class Dao {

    private static Dao dao = null;
    private static Connection connection = null;
    private static String driver;
    private static String aliasname;
    private static String url;
    private static String username;
    private static String password;

    private static final String erroDeConexao = "Não foi possível conectar "
            + "com o banco de dados";
    private static final String erroDeFechamento = "Não foi possível fechar "
            + "o banco de dados";

    private Dao() {

    }

    private void getDataConnection() throws FileNotFoundException, IOException, ClassNotFoundException {
        Properties propriedades = new Properties();
        FileInputStream arquivoDePropriedades;
        
        try {
            arquivoDePropriedades = new FileInputStream("database.properties");
            propriedades.load(arquivoDePropriedades);
            driver = propriedades.getProperty("jdbc.driver");
            aliasname = propriedades.getProperty("jdbc.aliasname");
            url = propriedades.getProperty("jdbc.url");
            username = propriedades.getProperty("jdbc.username");
            password = propriedades.getProperty("jdbc.password");
      
 

    Class.forName (driver);
}
catch (FileNotFoundException e) {
            StringBuilder mensagem = new StringBuilder(erroDeConexao);
            mensagem.append("\nMotivo: ").append(e.getMessage());
            throw new FileNotFoundException(mensagem.toString());
        } catch (IOException e) {
            StringBuilder mensagem = new StringBuilder(erroDeConexao);
            mensagem.append("\nMotivo: ").append(e.getMessage());
            throw new IOException(mensagem.toString());
        } catch (ClassNotFoundException e) {
            StringBuilder mensagem = new StringBuilder(erroDeConexao);
            mensagem.append("\nMotivo: ").append(e.getMessage());
            throw new ClassNotFoundException(mensagem.toString());
        }
    }

    private void getConnection() throws FileNotFoundException, IOException, ClassNotFoundException,
            SQLException {
        try {
            getDataConnection();
            connection = DriverManager.getConnection(url + aliasname, username, password);
        } catch (SQLException e) {
            StringBuilder mensagem = new StringBuilder(erroDeConexao);
            mensagem.append("\nMotivo: ").append(e.getMessage());
            throw new SQLException(mensagem.toString());
        }
    }

    public static Dao getInstance() {
        if (dao == null) {
            dao = new Dao();
        }
        return dao;
    }

    public Connection getInstanceConnection() throws SQLException, FileNotFoundException, IOException, ClassNotFoundException {
        if (connection == null || connection.isClosed()) {
            getConnection();
        }
        return connection;
    }

    public boolean closeConnection() throws SQLException {
        boolean result = false;
        try {
            if (connection != null && !connection.isClosed()) {
                connection.close();
            }
            result = true;
        } catch (SQLException e) {
            StringBuilder mensagem = new StringBuilder(erroDeFechamento);
            mensagem.append("\nMotivo: ").append(e.getMessage());
            result = false;
            throw new SQLException(mensagem.toString());
        } finally {
            return result;
        }
    }

}
